﻿using CleverDD.Model.Communication.PLC;
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using CleverDD.Helper.Tool;
using CleverDD.Model.Communication.SerialPort;
using CleverDD.Helper.Communication.SerialPortFolder;

// ReSharper disable once CheckNamespace
namespace CleverDD.Helper
{
    public partial class StaticTool
    {
        public static List<int> BoundList = new List<int>
        {
            9600,
            115200,
            1382400,
            921600,
            460800,
            256000,
            230400,
            128000,
            76800,
            57600,
            43000,
            38400,
            19200,
            14400,
            4800,
            1200
        };
        public static List<int> DataBitList = new List<int> { 8, 7, 6, 5 };


        public static List<SerialPortInfoEntity> SerialPortInfoList = new List<SerialPortInfoEntity>();

        public static List<string> GetAllPortName()
        {
            return SerialPort.GetPortNames().ToList();
        }


        public static void InitStaticSerialPortInfoList()
        {
            SerialPortInfoList = JsonParam.LoadParamPath<List<SerialPortInfoEntity>>(SerialPortSavePath, SerialPortListSaveName) ??
                                 new List<SerialPortInfoEntity>();
        }

        public static List<SerialPortInfoEntity> LoadSerialPortInfoList()
        {
            List<SerialPortInfoEntity> serialPortInfoList =
                JsonParam.LoadParamPath<List<SerialPortInfoEntity>>(SerialPortSavePath, SerialPortListSaveName) ??
                new List<SerialPortInfoEntity>();
            return serialPortInfoList;

        }

        public static bool SavaSerialPortInfoList(List<SerialPortInfoEntity> serialPortInfoList)
        {
            serialPortInfoList = serialPortInfoList.OrderBy(s => s.SortIndex).ToList();
            return JsonParam.SaveParamPath(SerialPortSavePath, SerialPortListSaveName, serialPortInfoList);
        }

        #region Tool相关
        public static List<SerialPortTool> SerialPortToolList = new List<SerialPortTool>();

        /// <summary>
        /// 打开所有已经启用且存在的串口
        /// </summary>
        /// 
        //1.如果修改完串口参数，在调用该方法前，先更新了SerialPortInfoList,那就会先关闭原先打开的串口，再打开新的，实现了参数热切换。
        // 2.每个SerialPortTool 跟 SerialPortInfo 是一对一的关系,SerialPortTool构造方法要传SerialPortInfo
        // 3.SerialPortTool 里面含有一个 SerialPort 对象，SerialPortTool 根据SerialPortInfo的信息，将SerialPort 初始化
        // 4.后续的操作实际就是操作的SerialPort对象，写成静态的，保证了可以跨页面操作。
        // 5.重新初始化，是对静态对象的操作。关闭了已经打开的串口，再重新打开新的。
        // 6.如果配置了串口，且启用了，程序打开后会占用串口
        public static void InitSerialPortToolList()
        {
            CloseAllSerialPort();
            SerialPortToolList.Clear();
            foreach (var item in SerialPortInfoList)
            {
                SerialPortToolList.Add(new SerialPortTool(item));
            }
            OpenAllSerialPort();
        }

        public static void OpenAllSerialPort()
        {
            foreach (var item in SerialPortToolList)
            {
                item.OpenSerialPort();
            }
        }

        public static void CloseAllSerialPort()
        {
            foreach (var item in SerialPortToolList)
            {
                item.CloseSerialPort();
            }
        }




        #endregion



    }
}
